package br.com.toscano.contpedido.view;

import java.util.ArrayList;
import java.util.Calendar;
import java.util.Collections;
import java.util.Comparator;
import java.util.Date;
import java.util.Iterator;
import java.util.List;

import javax.faces.model.SelectItem;
import javax.inject.Inject;

import br.com.toscano.contpedido.business.PedidoBC;
import br.com.toscano.contpedido.domain.Pedido;
import br.gov.frameworkdemoiselle.annotation.NextView;
import br.gov.frameworkdemoiselle.annotation.PreviousView;
import br.gov.frameworkdemoiselle.stereotype.ViewController;
import br.gov.frameworkdemoiselle.template.AbstractListPageBean;
import br.gov.frameworkdemoiselle.transaction.Transactional;


@ViewController
@NextView("./pedido_agendar.jsf")
@PreviousView("./pedido_agendar.jsf")
public class PedidoAgendarMB extends AbstractListPageBean<Pedido, Long> {

	private static final long serialVersionUID = 1L;

	@Inject
	private PedidoBC pedidoBC;

	private Long idPedido = 0l;
	private Date dataProducao = new Date();
	private Integer hora = 12;
	private Integer minuto =0 ;
	private Pedido pedido =  null;

	private List<SelectItem> horas;
	private List<SelectItem> minutos;

	public List<SelectItem> getHoras() {
		horas = new ArrayList<SelectItem>();
		for (int i = 23; i >= 0; i--) {
			String descricao = "" + i;
			if (i <= 9) {
				descricao = "0" + i;
			}
			horas.add(new SelectItem(i, descricao));
		}

		return horas;
	}
	public void setHoras(List<SelectItem> horas) {
		this.horas = horas;
	}
	public List<SelectItem> getMinutos() {
		minutos = new ArrayList<SelectItem>();
		for (int i = 59; i >= 0; i--) {
			String descricao = "" + i;
			if (i <= 9) {
				descricao = "0" + i;
			}
			minutos.add(new SelectItem(i, descricao));
		}

		return minutos;
	}
	public void setMinutos(List<SelectItem> minutos) {
		this.minutos = minutos;
	}

	public Long getIdPedido() {
		return idPedido;
	}
	
	public void selecionarPedido() {

		this.dataProducao = null;
		this.hora = null;
		this.minuto = null;

		if (idPedido != null) {
			Pedido pedido = pedidoBC.load(idPedido);
			this.dataProducao = pedido.getDataProducao();
			this.hora = pedido.getHoraProducao();
			this.minuto = pedido.getMinutoProducao();
		}
	}

	public void setIdPedido(Long idPedido) {
		pedido = pedidoBC.load(idPedido);
		this.idPedido = idPedido;
	}

	public Date getDataProducao() {
		if (idPedido != null && idPedido != 0l) {
			Pedido pedido = pedidoBC.load(idPedido);
			this.dataProducao = pedido.getDataProducao();
		}
		return dataProducao;
	}

	public void setDataProducao(Date dataProducao) {
		
		this.dataProducao = dataProducao;
	}

	public Integer getHora() {
		if (idPedido != null && idPedido != 0l) {
			Pedido pedido = pedidoBC.load(idPedido);
			this.hora = pedido.getHoraProducao();
		}
		return hora;
	}

	public void setHora(Integer hora) {
		this.hora = hora;
	}

	public Integer getMinuto() {
		if (idPedido != null && idPedido != 0l) {
			Pedido pedido = pedidoBC.load(idPedido);
			this.minuto = pedido.getMinutoProducao();
		}
		return minuto;
	}

	public void setMinuto(Integer minuto) {
		this.minuto = minuto;
	}

	public void filtrar() {
		super.clear();
		super.getDataModel();
	}
	
	public void alterarProducao() {
		
		if (this.pedido != null && hora != null && minuto != null && dataProducao != null ) {
			Pedido pedido = pedidoBC.load(this.pedido.getId());
			pedido.setDataProducao(dataProducao);
			pedido.setHoraProducao(hora);
			pedido.setMinutoProducao(minuto);
			pedidoBC.update(pedido);
			this.clear();
		}
	}
	
	@Override
	protected List<Pedido> handleResultList() {
		
		List<Pedido> pedidos = this.pedidoBC.consultarPedidos(null, null, null, null, null, false, null, null, null, null, false, null);
		
		Collections.sort(pedidos, new Comparator<Pedido>() {
			  public int compare(Pedido p1, Pedido p2) {

				  String descricao1 = "";
				  String descricao2 = "";
				  if (p1.getDataProducao() != null ) {
					  Date data = p1.getDataProducao();
					  if (p1.getHoraProducao() != null) {
						  Calendar cal = Calendar.getInstance();
						  cal.setTime(data);
						  cal.set(Calendar.HOUR, p1.getHoraProducao());
						  data = cal.getTime();
					  }
					  if (p1.getMinutoProducao() != null) {
						  Calendar cal = Calendar.getInstance();
						  cal.setTime(data);
						  cal.set(Calendar.MINUTE, p1.getMinutoProducao());
						  data = cal.getTime();
					  }
					  descricao1 = "a" + data.getTime();
				  } else {
					  descricao1 = "z" + p1.getDataEntrega();
				  }
				  
				  if (p2.getDataProducao() != null ) {
					  Date data = p2.getDataProducao();
					  if (p2.getHoraProducao() != null) {
						  Calendar cal = Calendar.getInstance();
						  cal.setTime(data);
						  cal.set(Calendar.HOUR, p2.getHoraProducao());
						  data = cal.getTime();
					  }
					  if (p2.getMinutoProducao() != null) {
						  Calendar cal = Calendar.getInstance();
						  cal.setTime(data);
						  cal.set(Calendar.MINUTE, p2.getMinutoProducao());
						  data = cal.getTime();
					  }
					  descricao2 = "a" + data.getTime();
				  } else {
					  descricao2 = "z" + p2.getDataEntrega();
				  }
				  
			      return descricao1.compareTo(descricao2);
			  }
			});

		
		return pedidos;
	}

	@Transactional
	public String deletesSelection() {
		boolean delete;
		for (Iterator<Long> iter = getSelection().keySet().iterator(); iter.hasNext();) {
			Long id = iter.next();
			delete = getSelection().get(id);
			if (delete) {
				pedidoBC.registrarProducao(id);
				iter.remove();
			}
		}

		super.clear();
		return getPreviousView();
	}
	
	public String marcar() {
		List<Pedido> lista = getResultList();
		for (Pedido coop : lista) {
			getSelection().put(coop.getId(), true);
		}
		
		return this.getCurrentView();
	}
}